package com.demo.core.service.base;

import java.util.List;

import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.dao.base.support.SearchArgumentSupport;
import com.demo.core.model.Function;

/**
 * 功能服务接口
 * @author ryuu.kk
 *
 */
public interface FunctionService {

	/**
	 * 保存站点功能
	 * @param function 功能模型
	 * @return 主键ID
	 */
	Long save(Function function);
	
	/**
	 * 功能模型是否存在
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean exist(Long id);
	
	/**
	 * 删除站点功能模型
	 * @param functionId 功能模型主键ID
	 */
	void delete(Long functionId);
	
	/**
	 * 更新功能模型对象
	 * (对NAME、TITLE、ACTION、URL、TYPE、DESCRIPTION进行更新)
	 * @param id 主键ID
	 * @param function 功能模型
	 */
	void update(Long id, Function function);
	
	/**
	 * 查询功能模型
	 * @param id 主键ID
	 * @return 功能模型
	 */
	Function find(Long id);
	
	/**
	 * 通过类型查询功能列表
	 * @param type 类型
	 * @return 功能列表
	 */
	List<Function> findList(String type);
		
	/**
	 * 通过站点组ID查询站点功能集合
	 * @param siteGroupId 站点组ID
	 * @return 站点功能集合
	 */
	List<Function> findList(Long siteGroupId);
	
	/**
	 * 查询指定功能模型下的所有功能
	 * @param id 功能主键ID
	 * @return 功能模型列表
	 */
	List<Function> query(Long id);
	
	/**
	 * 查询指定功能模型下的所有功能
	 * @param id 功能主键ID
	 * @param siteGroupId 站点组ID
	 * @return 功能模型列表
	 */
	List<Function> query(Long id, Long siteGroupId);
	
	/**
	 * 查询功能树
	 * @param id 功能主键ID
	 * @return 功能模型(树形)
	 */
	Function tree(Long id);
	/**
	 * 查询功能树（指定深度）
	 * @param id 主键ID
	 * @param depths 深度
	 * @return 功能模型(树形)
	 */
	Function tree(Long id, int...depths);
	
	/**
	 * 查询功能树（指定深度）
	 * 站点组规定了该类型的站点应该享有的最大功能集合
	 * 但站点功能表定义了站点的功能.
	 * 站点功能表中一个站点的功能数据将不会超过功能表中,该站点在站点组中最大的功能集合。
	 * @param id 主键ID
	 * @param siteGroupId 站点组ID
	 * @param depths 深度
	 * @return 功能模型(树形)
	 */
	Function tree(Long id, Long siteGroupId, int...depths);
	
	/**
	 * 分页检索功能
	 * @param siteGroupId 站点类型ID
	 * @param argumentSupport
	 */
	ResultSearchResult<Function> search(Long siteGroupId, SearchArgumentSupport argumentSupport);
}
